#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
const int M=1e5+7;
int n,m;
double L,V;
double d,v,a;
int p;
int num[N],dp1[N],dp2[N];
int id[M];
vector<int>vo[M],vos;
//int lm[M],rm[M];
int Lac()
{
    return ((V*V)-(v*v))/(2.0*a);
}
struct node
{
    int lm,rm;
}q[M];
bool cmp(node x,node y)
{
    if(x.lm==y.lm) return x.rm<y.rm;
    return x.lm<y.lm;
}
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T;
    cin>>T;
    while(T--)
    {
        scanf("%d%d",&n,&m);
        cin>>L>>V;
        for(int i=0;i<=1e6;i++) num[i]=dp2[i]=0;
        for(int i=1;i<=1e5;i++) vo[i]=vos;
        for(int i=1;i<=n;i++)
        {
            cin>>d>>v>>a;
            int l,r;
            if(v>V && a<0)        l=d,r=d+Lac();
            else if(v>V && a==0)  l=d,r=L;
            else if(v>V && a>0)   l=d,r=L;
            else if(v==V && a<0)  l=-1,r=-1;
            else if(v==V && a==0) l=-1,r=-1;
            else if(v==V && a>0)  l=d+1,r=L;
            else if(v<V && a<0)   l=-1,r=-1;
            else if(v<V && a==0)  l=-1,r=-1;
            else if(v<V && a>0)   l=d+Lac(),r=L;
            num[l]++,num[r+1]--;
            q[i].lm=l,q[i].rm=r;
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&p);
            id[i]=p;
            dp2[p]++;
        }
        for(int i=1;i<=1e6;i++)
        {
            dp2[i]+=dp2[i-1];
        }
        int ans1=0;
        for(int i=1;i<=n;i++)
        {
            int l=q[i].lm,r=q[i].rm;
            if(l==-1 && r==-1) continue;
            if(dp2[r]-dp2[l-1]>=1) ans1++;
            else q[i].lm=-1,q[i].rm=-1;
        }
        cout<<ans1<<' ';
        sort(q+1,q+1+n,cmp);
        int k=1;
        while(q[k].lm==-1) k++;
        for(int i=1;i<=m;i++)
        {
            for(int j=k;j<=n;j++)
            {
                if(id[i]<q[j].lm) break;
                if(id[i]>=q[j].lm && id[i]<=q[j].rm)
                    vo[i].push_back(j);
            }
        }
        /*for(int i=1;i<=m;i++)
        {
            int a=vo[i].size();
            for(int j=0;j<a;j++)
                cout<<vo[i][j]<<' ';
            cout<<endl;
        }*/
        int ans2=0;
        for(int i=1;i<=m;i++)
        {
            int j=i+1;
            if(vo[i].empty())
            {
                ans2++;
                continue;
            }
            while(!vo[j].empty() && j<=m)
            {
                int s1=vo[i].size(),s2=vo[j].size();
                bool fff=true;
                for(int ii=0;ii<s1;ii++)
                {
                    bool flag=false;
                    for(int jj=0;jj<s2;jj++)
                    {
                        if(vo[ii]==vo[jj])
                        {
                            flag=true;
                            break;
                        }
                    }
                    if(flag==false){
                        fff=false;
                        break;
                    }
                }
                if(fff)
                {
                    ans2++;
                    break;
                }
                j++;
            }
        }
        cout<<ans2<<endl;
    }
    return 0;
}


/*
10 10 175391 226
31181 234 -546
32757 670 -9
43723 775 -3
78541 862 -4
26626 961 -13
54690 759 -998
56165 659 -3
56531 776 -34
32860 950 -6
86709 145 47
31182 33025 46753 52673 57685 60635 99569 124240 162898 170704

*/
